package com.zbkj.common.model.bte;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * 支付平台响应结果
 *
 * @author Swallows
 * @date 2022-08-23 11:01
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PlatformResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 错误代码 发生错误时返回
     */
    @JsonProperty("error_code")
    private String errorCode;

    /**
     * 错误信息,发生错误时返回
     */
    @JsonProperty("error_message")
    private String errorMessage;

    /**
     * 操作结果
     */
    private Boolean success;

    /**
     * success为true 时有返回
     */
    @JsonProperty("return_value")
    private ReturnValue returnValue;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class ReturnValue {

        /**
         * 数币营销补贴金额
         */
        @JsonProperty("ecny_amount")
        private BigDecimal ecnyAmount;

        /**
         * 退款完成时间，格式为yyyy-MM-dd HH:mm:ss
         */
        @JsonProperty("refund_time")
        private String refundTime;

        /**
         * 退款优惠信息，微信交易返回
         */
        @JsonProperty("refund_detail")
        private List<Object> refundDetail;

        /**
         * 优惠退款金额 单位元
         */
        @JsonProperty("coupon_refund_fee")
        private BigDecimal couponRefundFee;

        /**
         * 剩余可退金额 单位元
         */
        @JsonProperty("over_amount")
        private BigDecimal overAmount;

        /**
         * 补贴金 会原路退回至补贴金账户 单位元
         */
        @JsonProperty("subsidy_fee")
        private BigDecimal subsidyFee;

        /**
         * 服务商设置的分佣费
         */
        @JsonProperty("liquidator_commission_fee")
        private BigDecimal liquidatorCommissionFee;

        /**
         * 服务商设置的分佣费率
         */
        @JsonProperty("liquidator_commission_rate")
        private BigDecimal liquidatorCommissionRate;

        /**
         * 平台手续费
         */
        @JsonProperty("pay_platform_fee")
        private BigDecimal payPlatformFee;

        /**
         * 平台手续费率
         */
        @JsonProperty("pay_platform_rate")
        private BigDecimal payPlatformRate;

        /**
         * 实退金额，单位为元
         */
        @JsonProperty("net_receipt_amount")
        private BigDecimal netReceiptAmount;

        /**
         * 退款发起金额，单位为元
         */
        @JsonProperty("total_fee")
        private BigDecimal totalFee;

        /**
         * 微信侧退款订单号
         */
        @JsonProperty("plate_refund_no")
        private String plateRefundNo;

        /**
         * 退款状态
         * <br>REFUND_SUCCESS 退款成功
         * <br>REFUND_PROCESSING退款中
         * <br>REFUND_FAILER退款失败
         */
        @JsonProperty("refund_status")
        private String refundStatus;

        /**
         * 退款订单号 本系统自己生成
         */
        @JsonProperty("out_refund_no")
        private String outRefundNo;

        /**
         * 平台返回的退款订单号
         */
        @JsonProperty("refund_no")
        private String refundNo;

        /**
         * 聚合平台分配的商户id(必传)
         */
        @JsonProperty("store_id")
        private String storeId;

        /**
         * 订单号 本系统自己生成的(必传)
         */
        @JsonProperty("out_trade_no")
        private String outTradeNo;

        /**
         * 聚合收单平台产生的订单号
         */
        @JsonProperty("trade_no")
        private String tradeNo;

        /**
         * 支付金额(必传)
         */
        @JsonProperty("total_amount")
        private BigDecimal totalAmount;

        /**
         * 订单类型为2-native支付时返回，可直接通过该链接生成二维码扫码支付
         */
        @JsonProperty("qr_code")
        private String qrCode;

        /**
         * 支付渠道(必传): <br>
         * 1-支付宝<br>
         * 2-微信<br>
         * 6-云闪付<br>
         * 9-数字人民币
         */
        @JsonProperty("pay_platform_type")
        private String payPlatformType;

        /**
         * 付款用户id，“微信sub_openid”，“支付宝 user_id”，“云闪付user_id”
         * 微信公众号、小程序、支付宝服务窗、支付宝小程序、云闪付JS支付必填
         */
        @JsonProperty("user_id")
        private String userId;

        /**
         * pull_up_type为1时有值，服务商可根据返回的Json字符串信息调用官方接口拉起支付
         */
        @JsonProperty("mini_pay_info")
        private MiniPayInfo miniPayInfo;

        /**
         * 支付链接，pay_platform_type=6-云闪付时返回
         */
        @JsonProperty("jspay_url")
        private String jspayUrl;

        /**
         * 微信 支付宝下的子商户号 一个商户有多个子商户号的情况下必填
         */
        @JsonProperty("sub_merchant_no")
        private String subMerchantNo;

        /**
         * 服务商的商户编号,由服务商自己定义,该商户编号必须在服务商系统中唯一
         */
        @JsonProperty("merchant_id")
        private String merchantId;

        /**
         * 1:支付宝线下支付 3:微信线下支付, 16:银行卡收单借记<br>
         * 17:银行卡收单贷记, 20:银联线下支付,  232:微信0费率行业<br>
         * 233:微信0.1费率行业, 234:微信0.3费率行业, 235:微信0.38费率行业<br>
         * 236:微信0.6费率行业, 300:支付宝0费率行业, 301:支付宝0.1费率行业<br>
         * 241:普通支付宝预授权，242:普通微信预授权，243:普通银联二维码预授权<br>
         * 244:普通支付宝预授权完成，245:普通微信预授权完成，246:普通银联二维码预授权完成<br>
         * 61-数字人民币，pay_type=62-银联分期
         */
        @JsonProperty("pay_type")
        private String payType;

        /**
         * 风控信息<br>
         * terminal_ip<br> ip
         * terminal_location 经纬度
         */
        @JsonProperty("risk_info")
        private Object riskInfo;

        /**
         * 预付卡卡号(预付卡交易必传)
         */
        @JsonProperty("prepay_card_no")
        private String prepayCardNo;

        /**
         * 订单状态(预付卡交易返回)
         * 0-支付中；1-支付成功；2-支付失败；
         */
        @JsonProperty("pay_status")
        private String payStatus;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class MiniPayInfo {

        private String timeStamp;

        @JsonProperty("package")
        private String packAge;

        private String paySign;

        private String appId;

        private String signType;

        private String nonceStr;

        private String mwebUrl;
    }
}
